/*
 * To change this template, choose Tools | Templates
// * and open the template in the editor.
 */
package dao;

import java.util.List;
import modelo.Amigo;
import modelo.Seccion;
import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.sql.QuerySelect;
import org.hibernate.transform.ResultTransformer;
import org.hibernate.transform.RootEntityResultTransformer;

/**
 *
 * @author Elias Mendoza
 */
public class SeccionDao extends OperacionesDao{
  
  
  public Seccion consultaSeccionById(int id){
    Seccion seccion = null;
    try{
      iniciarOperacion();
      seccion =(Seccion) sesion.get(Seccion.class, id);
      System.out.println(seccion.getNumero());
    }finally{
      sesion.close();
    }
    return seccion;
  }
   public Seccion loadSeccion(Seccion secc){
    Seccion seccion = null;
    try{
      iniciarOperacion();
      seccion =(Seccion) sesion.load(Seccion.class, secc.getId());
      System.out.println(seccion.getNumero());
    }finally{
      sesion.close();
    }
    return seccion;
  }
  
  public Seccion consultaSeccionesBynumero(int numero){
    Seccion seccion;
    try{
      iniciarOperacion();
      Criteria criteria = sesion.createCriteria(Seccion.class);
      criteria.add(Restrictions.eq("numero", numero));
      seccion = (Seccion)criteria.uniqueResult();
      
      System.out.println(seccion.getNumero()+" "+seccion.getColonias());
    }finally{
      sesion.close();
    }
    return seccion;
    
  }
  public List consultaSecciones(DetachedCriteria query){
    List lista=null;
    try{
      
      iniciarOperacion();
      

      ProjectionList projeccion = Projections.projectionList();
       
      
      query.createCriteria("personas");
      
       projeccion.add(Projections.groupProperty("numero"));
       
      projeccion.add(Projections.property("colonias"));
      projeccion.add(Projections.property("localidad"));
      
      projeccion.add(Projections.count("personas"));
     
      query.addOrder(Order.asc("numero"));
      query.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
      query.setProjection(projeccion);
      lista =  query.getExecutableCriteria(sesion).list();
      
    }finally{
      sesion.close();
    }
    return lista;
    
  }
  public Amigo[] consultaAmigos(int idSeccion){
    List lista = null;
    try{
      iniciarOperacion();
        Query query = sesion.createQuery("select elements(amigos) from Seccion where id= :id");
      query.setParameter("id", idSeccion);
      lista = query.list();
      
      for(Object obj:lista){
        Amigo amigo = (Amigo) obj;
        System.out.println(amigo.getNombre());
      }
    }finally{
      sesion.close();
    }
    return (Amigo[]) lista.toArray(new Amigo[lista.size()]);
  }
    public Seccion[] consultaSecciones() {
    List query = null;
    try {
      iniciarOperacion();
      query = sesion.createQuery("From Seccion").list();
  
    } finally {
      sesion.close();
    }
    return (Seccion[]) query.toArray(new Seccion[query.size()]);
  }
  
}
